﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace BU
{
    [Serializable()]
    public class BUWinkel
    {
        //Singleton implementatie. Slechts 1 instantie van winkel
        private static BUWinkel singleton;        

        //Lijst van rekken binnen de winkel
        private List<Rek> rekken;

        //Plattegrond van de winkel
        private Image plattegrond;

        /// <summary>
        /// Standaard constructor
        /// </summary>
        private BUWinkel()
        {
        }

        /// <summary>
        /// Constructor van klasse winkel
        /// </summary>
        /// <param name="Plattegrond"></param>
        private BUWinkel(Image Plattegrond)
        {
            rekken = new List<Rek>();
            this.plattegrond = Plattegrond;
        }

        /// <summary>
        /// Constructor voor het deserializen
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ctxt"></param>
        private BUWinkel(SerializationInfo info, StreamingContext ctxt)
        {
            this.rekken = (List<Rek>)info.GetValue("Rekken", typeof(List<Rek>));
            singleton = (BUWinkel)info.GetValue("Singleton", typeof(BUWinkel));
            this.plattegrond = (Image)info.GetValue("Plattegrond", typeof(Image));
        }

        /// <summary>
        /// Methode voor de fields toe te voegen aan het serializen
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ctxt"></param>
        public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
        {
            info.AddValue("Rekken", this.rekken);
            info.AddValue("Singleton", singleton);
            info.AddValue("Plattegrond", this.plattegrond);
        }

        /// <summary>
        /// Handelt de Singleton af met een image
        /// </summary>
        /// <param name="Plattegrond">Image van plattegrond</param>
        /// <returns></returns>
        public static BUWinkel GetInstance(Image Plattegrond)
        {
            if (singleton == null)
            {
                singleton = new BUWinkel(Plattegrond);
            }
            return singleton;
        }

        /// <summary>
        /// Handelt de Singleton af
        /// </summary>       
        public static BUWinkel GetInstance()
        {
            return singleton;
        }

        /// <summary>
        /// Voegt een rek toe aan de winkel
        /// </summary>
        /// <param name="punten">De coordinaten van het rek</param>
        public void VoegRekToe(Point[] punten)
        {
            rekken.Add(new Rek(punten));
        }

        /// <summary>
        /// Voegt een rek toe aan de winkel
        /// </summary>
        /// <param name="punten">De coordinaten van het rek</param>
        public void VoegRekToe(List<Point> punten)
        {
            rekken.Add(new Rek(punten));
        }

        /// <summary>
        /// Verwijdert een rek uit de winkel
        /// </summary>
        /// <param name="punten">De coordinaten van het rek</param>
        public void VerwijderRek(Point[] punten)
        {            
        }

        /// <summary>
        /// Een simpele check 
        /// </summary>
        /// <param name="plaats"></param>
        /// <returns></returns>
        public Point[] InRek(Point plaats)
        {
            Point[] antwoord = new Point[4];
            for (int i = 0; i < rekken.Count; i++)
            {
                if (rekken[i].binnenRek(plaats)) 
                {
                    antwoord = rekken[i].Hoeken;                        
                    break;
                }
            }
            return antwoord;
        }

        #region Properties
        
        /// <summary>
        /// Property voor Rekken
        /// </summary>
        internal List<Rek> Rekken
        {
            get { return rekken; }
            set { rekken = value; }
        }

        public int aantalRekken
        {
            get { return rekken.Count; }
        }

        /// <summary>
        /// Property voor plattegrond image
        /// </summary>
        public Image Plattegrond
        {
            set { plattegrond = value; }
            get { return plattegrond; }
        }
        #endregion

    }
}